/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package espe.ccsoft.controllers;

import espe.ccsoft.controllers.utils.JsfUtil;
import espe.ccsoft.controllers.utils.Mensajes;
import espe.ccsoft.controllers.utils.PaginationHelper;
import espe.ccsoft.controllers.utils.Validaciones;
import espe.ccsoft.dao.DespachoDao;
import espe.ccsoft.models.Despacho;
import espe.ccsoft.models.Socio;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseId;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.servlet.ServletContext;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

/**
 *
 * @author Carlos
 */
@ManagedBean
@RequestScoped
public class DespachoController {
    
    private File file;
    private Despacho despacho;
    private PaginationHelper pagination;
    private DespachoDao despachoDao;
    private int selectedItemIndex;
    private DataModel items = null;
    String realPath = "";
    Mensajes mensaje;
    Validaciones validaciones;

    public DespachoController() {
        mensaje = new Mensajes();
        validaciones = new Validaciones();
    }       

    public Despacho getSelected() {
        if (despacho == null) {
            despacho = new Despacho();
            selectedItemIndex = -1;
        }
        return despacho;
    }

    public DespachoDao getDespachoDao() {
        despachoDao = new DespachoDao();
        return despachoDao;
    }    

    public byte[] cargarImagen(Despacho despacho) throws IOException {
        try {
            byte[] data = despacho.getFoto().getBytes(1, (int) despacho.getFoto().length());
            return data;
        } catch (SQLException ex) {
            Logger.getLogger(Socio.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    public StreamedContent getImage() throws IOException, Exception {
        FacesContext context = FacesContext.getCurrentInstance();

        if (context.getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
            // So, we're rendering the HTML. Return a stub StreamedContent so that it will generate right URL.
            return new DefaultStreamedContent();
        } else {

            String despacho_id = context.getExternalContext().getRequestParameterMap().get("despachoId");
            Despacho despachoTmp = getDespachoDao().findByPK(Integer.parseInt(despacho_id));
            return new DefaultStreamedContent(new ByteArrayInputStream(cargarImagen(despachoTmp)));
        }
    }

    public final String crearDespacho() throws Exception {
        
        //Validaciones
        if (!validaciones.validarCedula(despacho.getRuc())) {
            mensaje.addMessageSuccefull("Cédula incorrecta!", "Por favor ingrese una cédula correcta.");
            return null;
        }

        if (!despacho.getEmail().equals("")) {
            if (!validaciones.validateEmail(despacho.getEmail())) {
                mensaje.addMessageSuccefull("Email incorrecto!", "Por favor ingrese una email correcto.");
                return null;
            }
        }

        
        //Permite Obtener la Ruta real de la imagen SinFoto
        ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
        realPath = (String) servletContext.getRealPath("/img/sinFoto.jpg");

        //Creacion del despacho
        DespachoDao dao = new DespachoDao();
        Despacho despachoTmp = dao.findByRUC(despacho.getRuc());
        despacho.setRutaFoto(realPath);
        try {
            if (despachoTmp == null) {
                dao.insert(despacho);
                mensaje.addMessageSuccefull("Registro exitoso!", "El despacho fue registrado correctamente.");
                return "Index";
            } else {
                mensaje.addMessageError("Registro fallido!", "El despacho ya se encuentra registrado.");
                return null;
            }
        } catch (Exception e) {
            return "/Error";
        }
    }

    public String modificarDespacho() throws Exception {
        DespachoDao dao = new DespachoDao();
        dao.update(despacho);
        mensaje.addMessageSuccefull("Modificación exitosa!", "Despacho modificado con éxito.");        
        return "Index";
    }

    public DataModel getItems() {
        if (items == null) {
            items = getPagination().createPageDataModel();
        }
        return items;
    }

    public PaginationHelper getPagination() {
        if (pagination == null) {
            pagination = new PaginationHelper(10) {

                @Override
                public int getItemsCount() {
                    try {
                        return getDespachoDao().findAll().size();
                    } catch (Exception ex) {
                        return 0;
                    }
                }

                @Override
                public DataModel createPageDataModel() {
                    try {
                        return new ListDataModel(getDespachoDao().findAll());
                    } catch (Exception ex) {
                        return new ListDataModel();
                    }
                }
            };
        }
        return pagination;
    }

    public final String cargarCrearDespacho() {
        despacho = new Despacho();
        selectedItemIndex = -1;
        return "Crear";
    }

    public final String cargarModificarDetalleDespacho(int id_despacho) throws Exception {
        despacho = getDespachoDao().findByPK(id_despacho);        
        return "Modificar";
    }

    public final String cargarDetalleModificarDespacho(int id_despacho) throws Exception {
        despacho = getDespachoDao().findByPK(id_despacho);        
        return "Detalle";
    }      
}
